package paint;

/**
 * La classe Ovale sert à la création d'un objet Ovale
 * @author Romain Bustos
 * @author Matthieu Perrin
 * @version 1.0
 */
public class Ovale extends Forme{
    protected Point P1;        //abscisse position
    protected Point P2;        //ordonnes position
    protected Point Origine;      //Origine
    
    /**
    *<b>Constructeur par defaut de la classe Ovale</b><br> 
    * <p>
    * Est utilisé lors d'une construction sans arguements d'un Ovale <br>
    * P1 = new Point() <br>
    * P2 = new Point() <br>
    * </p>
    */
    public Ovale() {
        P1 = new Point();
        P2 = new Point();
        Origine = new Point(); 
    }   
    
    
    /**
    *<b>Constructeur canonique de la classe Ovale</b><br> 
    * <p>
    * Est utilisé lors de la construction d'un Ovale<br>
    * </p>
    * @param X1
    *   Point P1 de construction d'un ovale
    * @param Y1
    *   Point P2 de construction d'un ovale
    */
    public Ovale(Point X1, Point Y1){
        P1 = X1;
        P2 = Y1;
        Origine = new Point();
    }
    
    
    /**
    *<b>Methode classe Ovale</b><br> 
    * <p>
    * Methode servant à calculer l'origine d'une forme ovale<br>
    * </p>
    */
    public void calculOrigine()
    {
        if ( P1.getX() < P2.getX())
        Origine.setX(P1.getX());
        else
        Origine.setX(P2.getX());
        
        if ( P1.getY() < P2.getY())
        Origine.setY(P1.getY());
        else
        Origine.setY(P2.getY());
    }
    
    /**
    *<b>Constructeur secondaire de la classe Ovale</b><br> 
    * <p>
    * Est utilisé pour créer le clone d'un objet Ovale courant<br>
    * </p>
    * @return Clone d'un Ovale
    */
    @Override
    public Ovale createClone(){
        return new Ovale(this.P1, this.P2);
    }
    
    
    /**
    *<b>Constructeur secondaire de la classe Ovale</b><br> 
    * <p>
    * Est utilisé pour créer la symetrie par rapport à l'origine de l'ovale courant<br>
    * </p>
    * @return Ovale symétrique par rapport à l'origine
    */
    public Ovale createSymetrieO(){
        return new Ovale(this.P1.createSymetrieX(), this.P2.createSymetrieY());
    }
    
    
    /**
    *<b>Constructeur secondaire de la classe Ovale</b><br> 
    * <p>
    * Est utilisé pour créer la symetrie par rapport X de l'ovale courant<br>
    * </p>
    * @return Ovale symétrique par rapport à X
    */
    public Ovale createSymetrieX(){
        return new Ovale(this.P1, this.P2.createSymetrieY());
    }
    
    
    /**
    *<b>Constructeur secondaire de la classe Ovale</b><br> 
    * <p>
    * Est utilisé pour créer la symetrie par rapport Y de l'ovale courant<br>
    * </p>
    * @return Ovale symétrique par rapport à Y
    */
    public Ovale createSymetrieY(){
        return new Ovale(this.P1.createSymetrieX(), this.P2);
    }
    

    /**
    *<b>Observateur de la classe Ovale</b><br> 
    * <p>
    * Est utilisé pour recupérer le point P1 d'un Ovale<br>
    * </p>
    * @return Point P1 de l'ovale courant
    */
    public Point getX() {
        return P1;
    }

    
    /**
    *<b>Observateur de la classe Ovale</b><br> 
    * <p>
    * Est utilisé pour recupérer le point P2 d'un Ovale<br>
    * </p>
    * @return Point P2 de l'ovale courant
    */
    public Point getY() {
        return P2;
    }
    

    /**
    *<b>Mutateur de la classe Ovale</b><br> 
    * <p>
    * Est utilisé pour modifier la valeur P1 de l'ovale courant<br>
    * </p>
    * @param X
    *       nouvelle valeur de point P1
    */
    public void setX(Point X) {
        this.P1 = X;
    }
    
    
    /**
    *<b>Mutateur de la classe Ovale</b><br> 
    * <p>
    * Est utilisé pour modifier la valeur P2 de l'ovale courant<br>
    * </p>
    * @param Y
    *       nouvelle valeur de point P2
    */
    public void setY(Point Y) {
        this.P2 = Y;
    }
    
    
    /**
    *<b>Observateur de la classe Ovale</b><br> 
    * <p>
    * Est utilisé pour calculer la largeur d'un Ovale<br>
    * </p>
    * @return Largeur d'un ovale
    */
    public int getLarg(){
        return Math.abs(this.P1.getX() - this.P2.getX());
    }
    
    
    /**
    *<b>Observateur de la classe Ovale</b><br> 
    * <p>
    * Est utilisé pour calculer la longueur d'un Ovale<br>
    * </p>
    * @return Longueur d'un ovale
    */
    public int getLong(){
        return Math.abs(this.P1.getY() - this.P2.getY()); 
    }
    
    
    /**
    *<b>Observateur de la classe Ovale</b><br> 
    * <p>
    * Est utilisé pour calculer l'origine d'un ovale<br>
    * </p>
    * @return origine d'un ovale
    */
    public Point getOrigine()
    {
        calculOrigine();
        return Origine;
    }
}

